/***************************************************************************
 *   Copyright (c) 2016 Werner Mayer <wmayer[at]users.sourceforge.net>     *
 *                                                                         *
 *   This file is part of the FreeCAD CAx development system.              *
 *                                                                         *
 *   This library is free software; you can redistribute it and/or         *
 *   modify it under the terms of the GNU Library General Public           *
 *   License as published by the Free Software Foundation; either          *
 *   version 2 of the License, or (at your option) any later version.      *
 *                                                                         *
 *   This library  is distributed in the hope that it will be useful,      *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU Library General Public License for more details.                  *
 *                                                                         *
 *   You should have received a copy of the GNU Library General Public     *
 *   License along with this library; see the file COPYING.LIB. If not,    *
 *   write to the Free Software Foundation, Inc., 59 Temple Place,         *
 *   Suite 330, Boston, MA  02111-1307, USA                                *
 *                                                                         *
 ***************************************************************************/


#ifndef APP_TRANSACTIONALOBJECT_H
#define APP_TRANSACTIONALOBJECT_H
#include "ExtensionContainer.h"
#include "Base/BaseClass.h"
#include "Property.h"
#include "PropertyContainer.h"
#include "PropertyOther.h"
#include "Python.h"
#include "Base/Writer.h"


namespace App {
    class Document;
    class TransactionObject;

    /** Base class of transactional objects
     */
    class TransactionalObject : public App::ExtensionContainer {
        PROPERTY_HEADER(App::TransactionalObject);
    public:
        
        App::PropertyLinkSubList    Support;
        /// Constructor
        TransactionalObject(void);
        ~TransactionalObject() override;
        virtual bool isAttachedToDocument() const;
        virtual const char* detachFromDocument();
        void onBeforeChangeProperty(Document* doc, const Property* prop);
        // virtual std::string getFullName() const {return std::string();}
        virtual PyObject *getPyObject(){return nullptr;}
        virtual void Save (Base::Writer &writer) const{}
        virtual bool removeDynamicProperty(const char* prop){return false;}
        virtual App::Property* addDynamicProperty(
            const char* type, const char* name=nullptr,
            const char* group=nullptr, const char* doc=nullptr,
            short attr=0, bool ro=false, bool hidden=false){return nullptr;}
        virtual void onBeforeChange(const Property* prop){}
        virtual void onChanged(const Property* prop) {}
        virtual void onPropertyStatusChanged(const Property &prop, unsigned long oldStatus){}
       virtual void Restore(Base::XMLReader &reader){}
      virtual  void handleChangedPropertyType(Base::XMLReader &reader, const char * TypeName, App::Property * prop) {}
       virtual void handleChangedPropertyName(Base::XMLReader &reader, const char * TypeName, const char *PropName) {}
        virtual unsigned int getMemSize(void) const {return 0;}
        virtual void attach(App::DocumentObject *){}
        virtual void updateData(const App::Property*){}
        virtual bool allowOverride(const App::DocumentObject &) const{return false;}
        virtual void restoreFinished(){}
        virtual App::Property *getDynamicPropertyByName(const char* name) const {
         return nullptr;
        }
    protected:
    };
} //namespace App


#endif // APP_TRANSACTIONALOBJECT_H
